use crate::config::ActixConf;
use anyhow::anyhow;
use schemars::schema::RootSchema;
use serde::de::DeserializeOwned;
use serde_json::json;
use serde_yaml::Value;
use std::collections::HashMap;
use std::error::Error;
use std::io::Stderr;

// pub struct AppConfig {
//     prop_map: HashMap<String, String>,
//
// }
//
// impl AppConfig {
//     pub fn new(file_path: &str) -> Self {
//         let schema =
//             serde_yaml::from_str::<RootSchema>(&std::fs::read_to_string(file_path).unwrap())
//                 .unwrap();
//         AppConfig {
//             prop_map: schema
//                 .schema
//                 .extensions
//                 .into_iter()
//                 .map(|(k, v)| {
//                     let mut map = HashMap::new();
//                     map.insert(k.clone(), v);
//                     (k.clone(), serde_json::to_string(&map).unwrap())
//                 })
//                 .collect::<HashMap<_, _>>(),
//         }
//     }
//     pub fn get<T>(&self) -> anyhow::Result<T>
//     where
//         T: DeserializeOwned,
//     {
//         for v in self.prop_map.keys() {
//             if let Ok(rs) = serde_json::from_str::<T>(self.prop_map.get(v).unwrap().as_str()) {
//                 return Ok(rs);
//             }
//         }
//         Err(anyhow!("no {} config found!", std::any::type_name::<T>()))
//     }
// }

// 用来处理yaml文件
// DeserializeOwned获取json字符串的所有权，避免引用
pub fn load_from_yaml<T>(rev_path: &str) -> anyhow::Result<T>
where
    T: DeserializeOwned,
{
    let schema = serde_yaml::from_str::<RootSchema>(&std::fs::read_to_string(rev_path)?)?;
    // println!("{:?}",json!(schema.schema.extensions));
    if let Ok(rs) = serde_json::from_str::<T>(serde_json::to_string(&schema.schema.extensions)?.as_str()) {
        return Ok(rs);
    }
    Err(anyhow!("no {} config found!", std::any::type_name::<T>()))
}

#[test]
fn test() {
    // let config = AppConfig::new("src/app.yml");
    // let result = config.get::<ActixConf>().unwrap();
    // println!("{:?}", result);
}
